// Package dao @author dingrui @since 2021/11/26
package dao

import (
	"github.com/go-xorm/xorm"

	"github.com/bannirui/mini-prize/dal/model"
	"github.com/bannirui/mini-prize/datasource"
)

//
//  ResultDao
//  @Description:
//
type ResultDao struct {
	engine *xorm.Engine
}

var (
	// 单例
	G_resultDao *ResultDao
)

func init() {
	G_resultDao = &ResultDao{engine: datasource.G_ormEngine}
}

//
//  Get
//  @Description: 根据id查询
//  @receiver d
//  @param id
//  @return data
//
func (d *ResultDao) Get(id int) (data *model.Result) {
	var (
		ok  bool
		err error
	)
	data = &model.Result{Id: id}
	if ok, err = d.engine.Get(data); !ok || err != nil {
		data.Id = 0
	}
	return
}

//
//  PageAll
//  @Description: 分页查询所有
//  @receiver d
//  @param page
//  @param size
//  @return dataList
//
func (d *ResultDao) PageAll(page, size int) (dataList []model.Result) {
	var (
		offset int
	)
	// 计算分页偏移量
	offset = (page - 1) * size
	// 初始化切片
	dataList = make([]model.Result, 0)
	_ = d.engine.Desc("id").Limit(size, offset).Find(&dataList)
	return
}

//
//  CountAll
//  @Description: 计数
//  @receiver d
//  @return cnt
//
func (d *ResultDao) CountAll() (cnt int64) {
	var (
		err error
	)
	if cnt, err = d.engine.Count(&model.Result{}); err != nil {
		cnt = 0
	}
	return
}

//
//  ListByGiftIds
//  @Description: 根据gift_id查询指定数量的奖品
//  @receiver d
//  @param size
//  @param giftIds
//  @return dataList
//
func (d *ResultDao) ListByGiftIds(size int, giftIds []int) (dataList []model.Result) {
	// 初始化切片
	dataList = make([]model.Result, 0)
	_ = d.engine.In("gift_id", giftIds).Desc("id").Limit(size).Find(&dataList)
	return
}

//
//  PageByGiftId
//  @Description: 根据gift_id分页查询
//  @receiver d
//  @param giftId
//  @param page
//  @param size
//  @return dataList
//
func (d *ResultDao) PageByGiftId(giftId, page, size int) (dataList []model.Result) {
	var (
		offset int
	)
	// 计算偏移量
	offset = (page - 1) * size
	// 初始化切片
	dataList = make([]model.Result, 0)
	_ = d.engine.Where("gift_id=?", giftId).Desc("id").Limit(size, offset).Find(&dataList)
	return
}

//
//  PageByUserId
//  @Description: 根据用户id分页查询
//  @receiver d
//  @param uid
//  @param page
//  @param size
//  @return dataList
//
func (d *ResultDao) PageByUserId(uid, page, size int) (dataList []model.Result) {
	var (
		offset int
	)
	// 计算偏移量
	offset = (page - 1) * size
	dataList = make([]model.Result, 0)
	_ = d.engine.Where("uid=?", uid).Desc("id").Limit(size, offset).Find(&dataList)
	return
}

//
//  CountByGiftId
//  @Description: 根据gift_id计数
//  @receiver d
//  @param giftId
//  @return cnt
//
func (d *ResultDao) CountByGiftId(giftId int) (cnt int64) {
	var (
		err error
	)
	if cnt, err = d.engine.Where("gift_id=?", giftId).Count(&model.Result{}); err != nil {
		cnt = 0
	}
	return
}

//
//  CountByUserId
//  @Description: 根据用户id计数
//  @receiver d
//  @param uid
//  @return cnt
//
func (d *ResultDao) CountByUserId(uid int) (cnt int64) {
	var (
		err error
	)
	if cnt, err = d.engine.Where("uid=?", uid).Count(&model.Result{}); err != nil {
		cnt = 0
	}
	return
}

//
//  Delete
//  @Description: 根据id逻辑删除
//  @receiver d
//  @param id
//  @return err
//
func (d *ResultDao) Delete(id int) (err error) {
	_, err = d.engine.Id(id).Update(&model.Result{Id: id, Status: 1})
	return
}

//
//  Update
//  @Description: 更新
//  @receiver d
//  @param data
//  @param columns
//  @return err
//
func (d *ResultDao) Update(data *model.Result, columns []string) (err error) {
	_, err = d.engine.Id(data.Id).MustCols(columns...).Update(data)
	return
}

//
//  InsertOne
//  @Description: 新增
//  @receiver d
//  @param data
//  @return err
//
func (d *ResultDao) InsertOne(data *model.Result) (err error) {
	_, err = d.engine.Insert(data)
	return
}
